import Component from '../models/component.model.js';

class ComponentVersionController {
  static async getAllComponentVersions(req, res) {
    try {
      const versions = await ComponentVersion.getAll();
      res.status(200).json(versions);
    } catch (error) {
      res.status(500).json({ message: '获取组件版本列表失败', error: error.message });
    }
  }

  static async getComponentVersionById(req, res) {
    try {
      const { id } = req.params;
      const version = await ComponentVersion.getById(id);
      if (!version) {
        return res.status(404).json({ message: '组件版本不存在' });
      }
      res.status(200).json(version);
    } catch (error) {
      res.status(500).json({ message: '获取组件版本详情失败', error: error.message });
    }
  }

  static async getComponentVersionsByComponentId(req, res) {
    try {
      const { componentId } = req.params;
      // 检查组件是否存在
      const component = await Component.getById(componentId);
      if (!component) {
        return res.status(404).json({ message: '组件不存在' });
      }
      
      const versions = await ComponentVersion.getByComponentId(componentId);
      res.status(200).json(versions);
    } catch (error) {
      res.status(500).json({ message: '获取组件版本列表失败', error: error.message });
    }
  }

  static async getActiveComponentVersionByComponentId(req, res) {
    try {
      const { componentId } = req.params;
      // 检查组件是否存在
      const component = await Component.getById(componentId);
      if (!component) {
        return res.status(404).json({ message: '组件不存在' });
      }
      
      const activeVersion = await ComponentVersion.getActiveByComponentId(componentId);
      if (!activeVersion) {
        return res.status(404).json({ message: '该组件没有激活的版本' });
      }
      res.status(200).json(activeVersion);
    } catch (error) {
      res.status(500).json({ message: '获取激活的组件版本失败', error: error.message });
    }
  }

  static async createComponentVersion(req, res) {
    try {
      const { componentId, version, content, isActive = false } = req.body;
      
      // 验证必要参数
      if (!componentId || !version || !content) {
        return res.status(400).json({ message: '组件ID、版本号和内容不能为空' });
      }
      
      // 检查组件是否存在
      const component = await Component.getById(componentId);
      if (!component) {
        return res.status(404).json({ message: '组件不存在' });
      }
      
      // 创建组件版本
      const versionId = await ComponentVersion.create(componentId, version, content, isActive);
      
      // 如果设置为激活状态，确保它是该组件的唯一激活版本
      if (isActive) {
        await ComponentVersion.setActive(versionId);
      }
      
      const newVersion = await ComponentVersion.getById(versionId);
      res.status(201).json(newVersion);
    } catch (error) {
      // 处理唯一键冲突错误
      if (error.code === 'ER_DUP_ENTRY') {
        return res.status(409).json({ message: '该组件已存在相同版本号' });
      }
      res.status(500).json({ message: '创建组件版本失败', error: error.message });
    }
  }

  static async updateComponentVersion(req, res) {
    try {
      const { id } = req.params;
      const updateData = req.body;
      
      // 检查版本是否存在
      const version = await ComponentVersion.getById(id);
      if (!version) {
        return res.status(404).json({ message: '组件版本不存在' });
      }
      
      // 如果更新了版本号，检查是否与同组件的其他版本冲突
      if (updateData.version && updateData.version !== version.version) {
        const versions = await ComponentVersion.getByComponentId(version.component_id);
        const versionExists = versions.some(v => v.version === updateData.version && v.id !== id);
        if (versionExists) {
          return res.status(409).json({ message: '该组件已存在相同版本号' });
        }
      }
      
      // 如果设置为激活状态，确保它是该组件的唯一激活版本
      if (updateData.isActive && updateData.isActive !== version.isActive) {
        await ComponentVersion.setActive(id);
      }
      
      const updatedVersion = await ComponentVersion.update(id, updateData);
      res.status(200).json(updatedVersion);
    } catch (error) {
      res.status(500).json({ message: '更新组件版本失败', error: error.message });
    }
  }

  static async setComponentVersionActive(req, res) {
    try {
      const { id } = req.params;
      
      // 检查版本是否存在
      const version = await ComponentVersion.getById(id);
      if (!version) {
        return res.status(404).json({ message: '组件版本不存在' });
      }
      
      const updatedVersion = await ComponentVersion.setActive(id);
      res.status(200).json(updatedVersion);
    } catch (error) {
      res.status(500).json({ message: '设置组件版本为激活状态失败', error: error.message });
    }
  }

  static async deleteComponentVersion(req, res) {
    try {
      const { id } = req.params;
      
      // 检查版本是否存在
      const version = await ComponentVersion.getById(id);
      if (!version) {
        return res.status(404).json({ message: '组件版本不存在' });
      }
      
      await ComponentVersion.delete(id);
      res.status(204).send();
    } catch (error) {
      res.status(500).json({ message: '删除组件版本失败', error: error.message });
    }
  }
}


export default ComponentVersionController;
